package yxxy.c_019.Semaphore;

import java.util.concurrent.Semaphore;

public class SemaphoreExample4 extends SemaphoreExample3 {
    // 之所以继承 SemaphoreService，仅仅是为了使用父类的打印时间的方法 0.0
    private Semaphore semaphore = new Semaphore(6);// 6表示总共有6个通路

    public void doSomething() {
        try {
            semaphore.acquire(2); // 2 表示进入此代码，就会消耗2个通路，2个通路从6个中扣除
            System.out.println(Thread.currentThread().getName() + ":doSomething start-" + GetFormatTimeStr());
            Thread.sleep(2000);
            System.out.println(Thread.currentThread().getName() + ":doSomething end-" + GetFormatTimeStr());
            semaphore.release(2); // 释放占用的 2 个通路
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public int availablePermits() {    // 查看可用通路数
        return semaphore.availablePermits();
    }

    public static void main(String args[]) {
        SemaphoreExample4 service = new SemaphoreExample4(); // 使用总 6 通路，每个线程占用2通路
        for (int i = 0; i < 10; i++) {
            MyThread t = new MyThread("thread" + (i + 1), service);
            t.start();// 这里使用 t.run() 也可以运行，但是不是并发执行了
            System.out.println("可用通路数：" + service.availablePermits());
        }
    }
}
